* bytecomp.el: Bring it up to version 2.10 of the
authorJim Blandy <jimb@redhat.com>
Fri, 11 Jun 1993 16:19:49 +0000 (16:19 +0000)
committerJim Blandy <jimb@redhat.com>
Fri, 11 Jun 1993 16:19:49 +0000 (16:19 +0000)
Zawinski-Furuseth compiler.  Changes from David Gillespie.

lisp/emacs-lisp/bytecomp.el

index d1f03516f7c09809a8d069e6aa395c90a921949c..a78e70dd7bdb7ca8267a460ac9e6fc011d7f349b 100644 (file)
@@ -8,9 +8,9 @@
 
 ;; Subsequently modified by RMS.
 
-;;; This version incorporates changes up to version 2.08 of the 
+;;; This version incorporates changes up to version 2.10 of the 
 ;;; Zawinski-Furuseth compiler.
-(defconst byte-compile-version "FSF 2.08")
+(defconst byte-compile-version "FSF 2.10")
 
 ;; This file is part of GNU Emacs.
 
@@ -38,8 +38,9 @@
 
 ;;; ========================================================================
 ;;; Entry points:
-;;;    byte-recompile-directory, byte-compile-file, batch-byte-compile,
-;;;    byte-compile, compile-defun
+;;;    byte-recompile-directory, byte-compile-file,
+;;;     batch-byte-compile, batch-byte-recompile-directory,
+;;;    byte-compile, compile-defun,
 ;;;    display-call-tree
 ;;; (byte-compile-buffer and byte-compile-and-load-file were turned off
 ;;;  because they are not terribly useful and get in the way of completion.)
 ;;; byte-compile-compatibility Whether the compiler should
 ;;;                            generate .elc files which can be loaded into
 ;;;                            generic emacs 18.
-;;; byte-compile-single-version        Normally the byte-compiler will consult the
-;;;                            above two variables at runtime, but if this 
-;;;                            is true before the compiler itself is loaded/
-;;;                            compiled, then the runtime checks will not be
-;;;                            made, and compilation will be slightly faster.
-;;;                            To use this, start up a fresh emacs, set this
-;;;                            to t, reload the compiler's .el files, and
-;;;                            recompile.  Don't do this in an emacs that has
-;;;                            already had the compiler loaded.
-;;; byte-compile-overwrite-file        If nil, delete old .elc files before saving.
+;;; emacs-lisp-file-regexp     Regexp for the extension of elisp source-files;
+;;;                            see also the function byte-compile-dest-file.
 
 ;;; New Features:
 ;;;
 ;;;    the whole form is evalled both at compile-time and at run-time.
 ;;;
 ;;;  o  The command Meta-X byte-compile-and-load-file does what you'd think.
+;;;     (This command has been discontinued.)
 ;;;
 ;;;  o  The command compile-defun is analogous to eval-defun.
 ;;;
 ;;;  o  If you run byte-compile-file on a filename which is visited in a 
 ;;;     buffer, and that buffer is modified, you are asked whether you want
 ;;;     to save the buffer before compiling.
+;;;
+;;;  o  You can add this to /etc/magic to make file(1) recognise the files
+;;;     generated by this compiler:
+;;;
+;;;      0     string          ;ELC            GNU Emacs Lisp compiled file,
+;;;      >4    byte            x               version %d
+;;;
 
 (require 'backquote)
 
 You may want to redefine `byte-compile-dest-file' if you change this.")
 
 (or (fboundp 'byte-compile-dest-file)
-    ;; The user may want to redefine this,
+    ;; The user may want to redefine this along with emacs-lisp-file-regexp,
     ;; so only define it if it is undefined.
     (defun byte-compile-dest-file (filename)
       "Convert an Emacs Lisp source file name to a compiled file name."
       (setq filename (file-name-sans-versions filename))
       (cond ((eq system-type 'vax-vms)
             (concat (substring filename 0 (string-match ";" filename)) "c"))
+           ((string-match emacs-lisp-file-regexp filename)
+            (concat (substring filename 0 (match-beginning 0)) ".elc"))
            (t (concat filename "c")))))
 
 ;; This can be the 'byte-compile property of any symbol.
@@ -339,7 +342,7 @@ expanded by the compiler as when expanded by the interpreter.")
 (defvar byte-compile-macro-environment byte-compile-initial-macro-environment
   "Alist of macros defined in the file being compiled.
 Each element looks like (MACRONAME . DEFINITION).  It is
-\(MACRONAME . nil) when a function is redefined as a function.")
+\(MACRONAME . nil) when a macro is redefined as a function.")
 
 (defvar byte-compile-function-environment nil
   "Alist of functions defined in the file being compiled.
@@ -1067,8 +1070,10 @@ don't ask and compile the file anyway."
   (interactive "DByte recompile directory: \nP")
   (if arg
       (setq arg (prefix-numeric-value arg)))
-  (save-some-buffers)
-  (set-buffer-modified-p (buffer-modified-p)) ;Update the mode line.
+  (if noninteractive
+      nil
+    (save-some-buffers)
+    (set-buffer-modified-p (buffer-modified-p))) ;Update the mode line.
   (let ((directories (list (expand-file-name directory)))
        (file-count 0)
        (dir-count 0)
@@ -1076,7 +1081,7 @@ don't ask and compile the file anyway."
     (displaying-byte-compile-warnings
      (while directories
        (setq directory (car directories))
-       (message "Checking %s..." directory)
+       (or noninteractive (message "Checking %s..." directory))
        (let ((files (directory-files directory))
             source dest)
         (while files
@@ -1096,7 +1101,9 @@ don't ask and compile the file anyway."
                        (and arg
                             (or (eq 0 arg)
                                 (y-or-n-p (concat "Compile " source "? "))))))
-                (progn (byte-compile-file source)
+                (progn (if (and noninteractive (not byte-compile-verbose))
+                           (message "Compiling %s..." source))
+                       (byte-compile-file source)
                        (setq file-count (1+ file-count))
                        (if (not (eq last-dir directory))
                            (setq last-dir directory
@@ -1126,7 +1133,7 @@ With prefix arg (noninteractively: 2nd arg), load the file after compiling."
      (list (read-file-name (if current-prefix-arg
                               "Byte compile and load file: "
                             "Byte compile file: ")
-                          file-dir file-name nil)
+                          file-dir nil nil file-name)
           current-prefix-arg)))
   ;; Expand now so we get the current buffer's defaults
   (setq filename (expand-file-name filename))
@@ -1309,6 +1316,22 @@ With argument, insert value in current buffer after the form."
   (save-excursion
     (set-buffer outbuffer)
     (goto-char 1)
+    ;;
+    ;; The magic number of .elc files is ";ELC", or 0x3B454C43.  After that is
+    ;; the file-format version number (18 or 19) as a byte, followed by some
+    ;; nulls.  The primary motivation for doing this is to get some binary
+    ;; characters up in the first line of the file so that `diff' will simply
+    ;; say "Binary files differ" instead of actually doing a diff of two .elc
+    ;; files.  An extra benefit is that you can add this to /etc/magic:
+    ;;
+    ;; 0       string          ;ELC            GNU Emacs Lisp compiled file,
+    ;; >4      byte            x               version %d
+    ;;
+    (insert
+     ";ELC"
+     (if (byte-compile-version-cond byte-compile-compatibility) 18 19)
+     "\000\000\000\n"
+     )
     (insert ";;; compiled by " (user-login-name) "@" (system-name) " on "
            (current-time-string) "\n;;; from file " filename "\n")
     (insert ";;; emacs version " emacs-version ".\n")
@@ -1893,8 +1916,8 @@ If FORM is a lambda or a macro, byte-compile it as a function."
           (if (memq fn '(t nil))
               (byte-compile-warn "%s called as a function" fn))
           (if (and handler
-                   (or (byte-compile-version-cond
-                        byte-compile-compatibility)
+                   (or (not (byte-compile-version-cond
+                             byte-compile-compatibility))
                        (not (get (get fn 'byte-opcode) 'emacs19-opcode))))
               (funcall handler form)
             (if (memq 'callargs byte-compile-warnings)
@@ -2015,9 +2038,9 @@ If FORM is a lambda or a macro, byte-compile it as a function."
 
 (defmacro byte-defop-compiler19 (function &optional compile-handler)
   ;; Just like byte-defop-compiler, but defines an opcode that will only
-  ;; be used when byte-compile-compatibility is true.
+  ;; be used when byte-compile-compatibility is false.
   (if (and (byte-compile-single-version)
-          (not byte-compile-compatibility))
+          byte-compile-compatibility)
       ;; #### instead of doing nothing, this should do some remprops,
       ;; #### to protect against the case where a single-version compiler
       ;; #### is loaded into a world that has contained a multi-version one.
@@ -2234,8 +2257,8 @@ If FORM is a lambda or a macro, byte-compile it as a function."
           (mapcar 'byte-compile-form (cdr form))
           (byte-compile-out
            (aref [byte-list1 byte-list2 byte-list3 byte-list4] (1- count)) 0))
-         ((and (< count 256) (byte-compile-version-cond
-                              byte-compile-compatibility))
+         ((and (< count 256) (not (byte-compile-version-cond
+                                   byte-compile-compatibility)))
           (mapcar 'byte-compile-form (cdr form))
           (byte-compile-out 'byte-listN count))
          (t (byte-compile-normal-call form)))))
@@ -2250,8 +2273,8 @@ If FORM is a lambda or a macro, byte-compile it as a function."
          ;; Concat of one arg is not a no-op if arg is not a string.
          ((= count 0)
           (byte-compile-form ""))
-         ((and (< count 256) (byte-compile-version-cond
-                              byte-compile-compatibility))
+         ((and (< count 256) (not (byte-compile-version-cond
+                                   byte-compile-compatibility)))
           (mapcar 'byte-compile-form (cdr form))
           (byte-compile-out 'byte-concatN count))
          ((byte-compile-normal-call form)))))
@@ -2350,8 +2373,8 @@ If FORM is a lambda or a macro, byte-compile it as a function."
 (defun byte-compile-insert (form)
   (cond ((null (cdr form))
         (byte-compile-constant nil))
-       ((and (byte-compile-version-cond
-              byte-compile-compatibility)
+       ((and (not (byte-compile-version-cond
+                   byte-compile-compatibility))
              (<= (length form) 256))
         (mapcar 'byte-compile-form (cdr form))
         (if (cdr (cdr form))
@@ -2649,9 +2672,20 @@ If FORM is a lambda or a macro, byte-compile it as a function."
     (let ((clauses (cdr (cdr (cdr form))))
          compiled-clauses)
       (while clauses
-       (let ((clause (car clauses)))
+       (let* ((clause (car clauses))
+               (condition (car clause)))
+          (cond ((not (symbolp condition))
+                 (byte-compile-warn
+                   "%s is not a symbol naming a condition (in condition-case)"
+                   (prin1-to-string condition)))
+                ((not (or (eq condition 't)
+                         (and (stringp (get condition 'error-message))
+                              (consp (get condition 'error-conditions)))))
+                 (byte-compile-warn
+                   "%s is not a known condition name (in condition-case)" 
+                   condition)))
          (setq compiled-clauses
-               (cons (cons (car clause)
+               (cons (cons condition
                            (byte-compile-top-level-body
                             (cdr clause) for-effect))
                      compiled-clauses)))
@@ -2992,6 +3026,21 @@ For example, invoke \"emacs -batch -f batch-byte-compile $emacs/ ~/*.el\""
              (prin1-to-string (cdr err)))
      nil)))
 
+(defun batch-byte-recompile-directory ()
+  "Runs `byte-recompile-directory' on the dirs remaining on the command line.
+Must be used only with -batch, and kills emacs on completion.
+For example, invoke \"emacs -batch -f batch-byte-recompile-directory .\""
+  ;; command-line-args-left is what is left of the command line (startup.el)
+  (defvar command-line-args-left)      ;Avoid 'free variable' warning
+  (if (not noninteractive)
+      (error "batch-byte-recompile-directory is to be used only with -batch"))
+  (or command-line-args-left
+      (setq command-line-args-left '(".")))
+  (while command-line-args-left
+    (byte-recompile-directory (car command-line-args-left))
+    (setq command-line-args-left (cdr command-line-args-left)))
+  (kill-emacs 0))
+
 
 (make-obsolete 'mod '%)
 (make-obsolete 'dot 'point)